
Adélia Cruz
Neural Network Developer
TL;DR: Use o Camoufox para evadir a fingerprinting do navegador e o CapSolver para resolver automaticamente CAPTCHAs como Cloudflare Turnstile e reCAPTCHA v2/v3. Juntos, eles permitem automação web estável e semelhante à humana em larga escala com mínima detecção e altas taxas de sucesso.

A automação web tornou-se essencial para coleta de dados, testes e várias operações comerciais. No entanto, sites modernos implementam medidas anti-bot sofisticadas e CAPTCHAs que podem interromper até mesmo scripts de automação bem elaborados.
A combinação do Camoufox e do CapSolver oferece uma solução poderosa para esse desafio:
Juntos, essas ferramentas permitem automação web sem interrupções que evita tanto a detecção de fingerprint quanto os desafios de CAPTCHA.
Este guia o ajudará a atingir três objetivos principais:
Camoufox é uma versão personalizada minimalista e discreta do Firefox projetada especificamente para raspagem de web e automação. Ao contrário de outras soluções anti-detecto que dependem de injeção de JavaScript (que pode ser detectada), o Camoufox implementa a injeção de fingerprint no nível C++ dentro do próprio navegador.
# Instale o pacote Python
pip install -U camoufox[geoip]
# Baixe o navegador Camoufox
camoufox fetch
from camoufox.sync_api import Camoufox
with Camoufox(humanize=True) as browser:
page = browser.new_page()
page.goto("https://example.com")
CapSolver é um serviço de resolução de CAPTCHA automático baseado em IA que suporta uma ampla gama de tipos de CAPTCHA. Ele fornece uma API simples que permite enviar desafios de CAPTCHA e receber soluções em segundos.
Bônus: Use o código
CAMOUFOXao se cadastrar para receber créditos extras!
Antes de combinar o Camoufox com o CapSolver, a automação web enfrentava vários problemas:
| Desafio | Impacto |
|---|---|
| Detecção de fingerprint do navegador | Scripts bloqueados antes de atingirem o conteúdo |
| Desafios CAPTCHA | Resolução manual necessária, interrompendo a automação |
| Sistemas de reputação de IP | Proxies rapidamente marcados e banidos |
| Análise de comportamento | Padrões não humanos detectados |
A integração do Camoufox + CapSolver resolve todos esses desafios em um único fluxo de trabalho.
O método de integração via API oferece controle total sobre o processo de resolução de CAPTCHA e funciona com qualquer tipo de CAPTCHA.
pip install camoufox[geoip] httpx
import asyncio
import httpx
from camoufox.async_api import AsyncCamoufox
CAPSOLVER_API_KEY = "SUA_CHAVE_DE_API"
CAPSOLVER_API = "https://api.capsolver.com"
async def create_task(task_payload: dict) -> str:
"""Crie uma tarefa de resolução de CAPTCHA e retorne o ID da tarefa."""
async with httpx.AsyncClient() as client:
response = await client.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": task_payload
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Erro do CapSolver: {result.get('errorDescription')}")
return result["taskId"]
async def get_task_result(task_id: str, max_attempts: int = 120) -> dict:
"""Verifique o resultado da tarefa até que seja resolvido ou expire o tempo."""
async with httpx.AsyncClient() as client:
for _ in range(max_attempts):
response = await client.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
result = response.json()
if result.get("status") == "ready":
return result["solution"]
elif result.get("status") == "failed":
raise Exception(f"Tarefa falhou: {result.get('errorDescription')}")
await asyncio.sleep(1)
raise TimeoutError("A resolução de CAPTCHA expirou!")
async def solve_captcha(task_payload: dict) -> dict:
"""Fluxo completo de resolução de CAPTCHA."""
task_id = await create_task(task_payload)
return await get_task_result(task_id)
Você também pode usar a extensão do CapSolver com o Camoufox para uma abordagem mais automática.
from camoufox.sync_api import Camoufox
with Camoufox(
addons=["/caminho/para/a/extensão/capsolver"],
headless=False # Extensões exigem modo com interface
) as browser:
page = browser.new_page()
# A extensão detectará e resolverá CAPTCHAs automaticamente
Cloudflare Turnstile é um dos desafios de CAPTCHA mais comuns. Aqui está como resolvê-lo:
import asyncio
from camoufox.async_api import AsyncCamoufox
CAPSOLVER_API_KEY = "SUA_CHAVE_DE_API"
CAPSOLVER_API = "https://api.capsolver.com"
async def solve_turnstile(site_key: str, page_url: str) -> str:
"""Resolva o Cloudflare Turnstile e retorne o token."""
import httpx
async with httpx.AsyncClient() as client:
# Crie a tarefa
response = await client.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
}
}
)
task_id = response.json()["taskId"]
# Verifique o resultado
while True:
result = await client.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
data = result.json()
if data.get("status") == "ready":
return data["solution"]["token"]
await asyncio.sleep(1)
async def main():
target_url = "https://example.com/pagina-protegida"
turnstile_site_key = "0x4XXXXXXXXXXXXXXXXX" # Encontre isso no código da página
async with AsyncCamoufox(
humanize=True,
headless=False,
os="windows"
) as browser:
page = await browser.new_page()
await page.goto(target_url)
# Aguarde o Turnstile carregar
await page.wait_for_selector('input[name="cf-turnstile-response"]', timeout=10000)
# Resolva o CAPTCHA
token = await solve_turnstile(turnstile_site_key, target_url)
print(f"Obteve token do Turnstile: {token[:50]}...")
# Injete o token
await page.evaluate(f'''
document.querySelector('input[name="cf-turnstile-response"]').value = "{token}";
// Defina o callback oculto se estiver presente
const callback = document.querySelector('[data-callback]');
if (callback) {{
const callbackName = callback.getAttribute('data-callback');
if (window[callbackName]) {{
window[callbackName]('{token}');
}}
}}
''')
# Submeta o formulário
await page.click('button[type="submit"]')
await page.wait_for_load_state("networkidle")
print("Turnstile evadido com sucesso!")
if __name__ == "__main__":
asyncio.run(main())
import asyncio
from camoufox.async_api import AsyncCamoufox
CAPSOLVER_API_KEY = "SUA_CHAVE_DE_API"
CAPSOLVER_API = "https://api.capsolver.com"
async def solve_recaptcha_v2(site_key: str, page_url: str) -> str:
"""Resolva o reCAPTCHA v2 e retorne o token."""
import httpx
async with httpx.AsyncClient() as client:
# Crie a tarefa
response = await client.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Erro: {result.get('errorDescription')}")
task_id = result["taskId"]
# Verifique o resultado
while True:
result = await client.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
data = result.json()
if data.get("status") == "ready":
return data["solution"]["gRecaptchaResponse"]
elif data.get("status") == "failed":
raise Exception(f"Falha: {data.get('errorDescription')}")
await asyncio.sleep(2)
async def main():
target_url = "https://example.com/login"
recaptcha_site_key = "6LcXXXXXXXXXXXXXXXXXXXXXXXXX" # Encontre no código da página
async with AsyncCamoufox(
humanize=True,
headless=False,
os=["windows", "macos"] # Seleção aleatória de sistema operacional
) as browser:
page = await browser.new_page()
await page.goto(target_url)
# Preencha os campos do formulário com pausas semelhantes às humanas
await page.fill('input[name="username"]', "user@example.com")
await asyncio.sleep(0.5) # Pausa semelhante à humana
await page.fill('input[name="password"]', "password123")
# Resolva o CAPTCHA
print("Resolvendo reCAPTCHA v2...")
token = await solve_recaptcha_v2(recaptcha_site_key, target_url)
print(f"Obteve token: {token[:50]}...")
# Injete o token no campo de resposta do reCAPTCHA
await page.evaluate(f'''
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.getElementById('g-recaptcha-response').style.display = 'block';
''')
# Submeta o formulário
await page.click('button[type="submit"]')
await page.wait_for_load_state("networkidle")
print("Login bem-sucedido!")
if __name__ == "__main__":
asyncio.run(main())
O reCAPTCHA v3 é baseado em pontuação e não exige interação do usuário. Você precisa especificar o parâmetro de ação.
import asyncio
from camoufox.async_api import AsyncCamoufox
CAPSOLVER_API_KEY = "SUA_CHAVE_DE_API"
CAPSOLVER_API = "https://api.capsolver.com"
async def solve_recaptcha_v3(
site_key: str,
page_url: str,
action: str = "verify",
min_score: float = 0.7
) -> str:
"""Resolva o reCAPTCHA v3 com ação e pontuação mínima especificadas."""
import httpx
async with httpx.AsyncClient() as client:
response = await client.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
"pageAction": action,
"minScore": min_score
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Erro: {result.get('errorDescription')}")
task_id = result["taskId"]
while True:
result = await client.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
data = result.json()
if data.get("status") == "ready":
return data["solution"]["gRecaptchaResponse"]
elif data.get("status") == "failed":
raise Exception(f"Falha: {data.get('errorDescription')}")
await asyncio.sleep(1)
async def main():
target_url = "https://example.com/pesquisa"
recaptcha_v3_key = "6LcXXXXXXXXXXXXXXXXXXXXXXXXX"
async with AsyncCamoufox(
humanize=2.0, # Máximo de 2 segundos de movimentos humanizados
headless=True, # Pode ser executado em modo headless para v3
geoip=True, # Detecta automaticamente a geolocalização a partir do proxy
) as browser:
page = await browser.new_page()
await page.goto(target_url)
# Resolva o reCAPTCHA v3 com ação "pesquisa"
print("Resolvendo reCAPTCHA v3...")
token = await solve_recaptcha_v3(
recaptcha_v3_key,
target_url,
action="pesquisa",
min_score=0.9 # Solicite uma pontuação alta
)
# Execute o callback com o token
await page.evaluate(f'''
// Envie o token via callback do site
grecaptcha.execute('{chave_v3_recaptcha}', {{ação: 'pesquisa'}})
.then(function(tokenOriginal) {{
// Substitua pelo nosso token resolvido
enviarPesquisa('{token}');
}});
''')
print("bypass de reCAPTCHA v3 concluído!")
if name == "main":
asyncio.run(main())
---
## Boas Práticas
### 1. Rotação de Proxy com GeoIP
Use o recurso de GeoIP do Camoufox para corresponder automaticamente aos impressões digitais com a localização do seu proxy:
```python
async with AsyncCamoufox(
geoip=True, # Detectar automaticamente a partir do IP do proxy
proxy={
"servidor": "http://proxy.example.com:8080",
"usuario": "user",
"senha": "pass"
}
) as browser:
# A impressão digital corresponderá à localização geográfica do proxy
pass
Mantenha as impressões digitais consistentes dentro de uma sessão, mas altere-as entre sessões:
from browserforge.fingerprints import Tela
# Restrinja para tamanhos de tela comuns
tela = Tela(
largura_min=1280,
largura_max=1920,
altura_min=720,
altura_max=1080
)
async with AsyncCamoufox(
sistema_operacional="windows",
tela=tela,
) as browser:
pass
Evite disparar limites de taxa adicionando atrasos:
import random
async def atraso_humano():
"""Atraso aleatório para imitar comportamento humano."""
await asyncio.sleep(random.uniform(1.0, 3.0))
# Use entre ações
await page.clicar('botão')
await atraso_humano()
await page.preencher('input', 'texto')
Sempre implemente tratamento adequado de erros para resolução de CAPTCHA:
async def resolver_com_retentativas(payload_tarefa: dict, max_tentativas: int = 3) -> dict:
"""Resolver CAPTCHA com lógica de tentativas."""
for tentativa in range(max_tentativas):
try:
return await resolver_captcha(payload_tarefa)
except TimeoutError:
if tentativa < max_tentativas - 1:
print(f"Tempo esgotado, tentando novamente... ({tentativa + 1}/{max_tentativas})")
await asyncio.sleep(5)
else:
raise
except Exception as e:
if "saldo" in str(e).lower():
raise # Não tentar novamente em erros de saldo
if tentativa < max_tentativas - 1:
await asyncio.sleep(2)
else:
raise
Pronto para impulsionar sua automação web com o Camoufox e o CapSolver?
Use o código CAMOUFOX ao se inscrever no CapSolver para receber créditos extras!

Esse bônus exclusivo ajuda você a começar a resolver CAPTCHAs imediatamente.
A integração do Camoufox e do CapSolver cria uma ferramenta poderosa para automação web:
Seja você construindo raspadores de web, sistemas de testes automatizados ou pipelines de coleta de dados, essa combinação oferece a confiabilidade e o disfarce que você precisa.
A: O CapSolver suporta todos os principais tipos de CAPTCHA. Turnstile da Cloudflare e reCAPTCHA v2/v3 têm as maiores taxas de sucesso. A integração funciona perfeitamente com qualquer CAPTCHA que o CapSolver suporte.
A: Sim! O Camoufox suporta o modo headless e mantém suas capacidades de spoofing de impressão digital. Para reCAPTCHA v3 e CAPTCHAs baseados em token, o modo headless funciona perfeitamente. Para CAPTCHAs v2 visíveis, o modo headed pode oferecer melhores resultados.
A: Procure no código fonte da página por:
data-sitekey ou elementos cf-turnstiledata-sitekey no div g-recaptchaA: Soluções comuns:
A: O Camoufox é baseado no Playwright, não no Selenium. No entanto, você pode usar o mesmo padrão de integração com a API do CapSolver com qualquer framework de automação de navegador.
Aprenda arquitetura de raspagem web escalável em Rust com reqwest, scraper, raspagem assíncrona, raspagem de navegador headless, rotação de proxies e tratamento de CAPTCHA compatível.

Compare o Selenium vs Puppeteer para resolver CAPTCHA. Descubra benchmarks de desempenho, notas de estabilidade e como integrar o CapSolver para o máximo de sucesso.
